package br.com.foxinline.manager.iptu;

import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.ConfigIptuServico;
import br.com.foxinline.servico.DadosIptuServico;
import br.com.foxinline.servico.ImovelServico;
import br.com.foxinline.servico.IptuServico;
import br.com.foxinline.util.Msg;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

/**
 *
 * @author luciano
 */
@ManagedBean
@ViewScoped
public class ManagerIPTU implements Serializable {

    @EJB
    private ImovelServico imovelServico;
    @EJB
    private IptuServico iptuServico;
    @EJB
    private DadosIptuServico dadosIptuService;
    @EJB
    private ConfigIptuServico configIptuServico;
//    private DadosIptu dadosIptu;
    private List<Iptu> iptus;
    private Proprietario proprietario;
    private Endereco endereco;
    private boolean possuiIptu;

    @PostConstruct
    public void init() {
//        Calendar calendar = GregorianCalendar.getInstance();
//        int ano = calendar.get(Calendar.YEAR);
//        dadosIptu = new DadosIptu();
//        dadosIptu.setAno(ano);
//        dadosIptu.setUfmp(new BigDecimal("2.40"));
//        dadosIptu.setCorrecao(new BigDecimal("2.40"));
//        dadosIptu.setVencimento(new Date());
        possuiIptu = possuiIPTU();
    }

    public void gerarIPTU() {
        gerarIPTU(new ArrayList<Imovel>(), false);
    }

    private boolean possuiIPTU() {
        return iptuServico.possuiIPTU(null);
    }

    public boolean isPossuiIptu() {
        return possuiIptu;
    }

    public void setPossuiIptu(boolean possuiIptu) {
        this.possuiIptu = possuiIptu;
    }

    public void gerarIPTU(Imovel imovel) {
        if (iptuServico.imovelValido(imovel)) {
            ArrayList<Imovel> imoveis = new ArrayList<Imovel>();
            imoveis.add(imovel);
            gerarIPTU(imoveis, true);
        } else {
            Msg.messagemError("Preencha corretamente todos os dados do imovel!");
        }
    }

    public void gerarIPTU(List<Imovel> imoveis, boolean regerar) {

        if (imoveis == null || imoveis.isEmpty()) {
            imoveis = imovelServico.findAll();
        }

        List<ConfigIptu> configs = configIptuServico.findAll();
        if (configs.isEmpty()) {
            Msg.messagemError("Configurações do IPTU não cadastradas!");
            return;
        }
        ConfigIptu config = configs.get(0);

        for (Imovel imovel : imoveis) {

            if (!iptuServico.imovelValido(imovel)) {
                continue;
            }

//            Imovel imovel = imovelService.find(2673L);
            Iptu iptu = new Iptu();

//            if (iptuService.possuiIPTU(imovel.getId()) && !regerar) {
//                continue;
//            }

            boolean possuiIPTU = iptuServico.possuiIPTU(imovel.getId());

            if (possuiIPTU) {
                iptu = iptuServico.findIptuByImovelId(imovel.getId()).get(0);
            }

            iptu.setImovelIrregular(!iptuServico.imovelValido(imovel));

            if (config.getDataVencimento() == null) {
                Calendar calendar = GregorianCalendar.getInstance();
                calendar.set(Calendar.MONTH, Calendar.AUGUST);
                calendar.set(Calendar.DAY_OF_MONTH, 31);

                config.setDataVencimento(calendar.getTime());
            }

            iptu.setDataPagamento(config.getDataVencimento());
            iptu.setImovel(imovel);
            BigDecimal vvt = iptuServico.vvt(imovel, config);
            BigDecimal vve = iptuServico.vve(imovel, config);
            BigDecimal vvi = vvt.add(vve);

            iptu.setTcc(iptuServico.tcc(imovel.getDimensoes(), config));
            iptu.setTcl(iptuServico.tcl(imovel.getDimensoes(), config));
            iptu.setTlp(iptuServico.tlp(imovel.getDimensoes(), config));
            iptu.setVve(vve);
            iptu.setVvt(vvt);
            iptu.setVvi(vvi);
            iptu.setAliquota(iptuServico.aliquota(imovel, vvi, config));
            iptu.setCorrecao(config.getUfmp());

            iptu.setIptu(iptu.getAliquota().divide(new BigDecimal("100")).multiply(iptu.getVvi()));

            BigDecimal valorIptu = iptu.getIptu();
            valorIptu = valorIptu.add(iptu.getTcc());
            valorIptu = valorIptu.add(iptu.getTcl());
            valorIptu = valorIptu.add(iptu.getTlp());
            iptu.setValor(valorIptu);
            valorIptu = valorIptu.multiply(config.getUfmp());
            //TODO Corrigir Implementar Valor Minimo
            if (valorIptu.compareTo(new BigDecimal(11.86)) < 0) {
                valorIptu = new BigDecimal(11.86);
            }
            iptu.setValorBaseCorrigido(valorIptu);

            Calendar calendar = GregorianCalendar.getInstance();

            iptu.setDataIptu(calendar.getTime());

            //TODO Add Vários
            //            for (Proprietario proprietario : imovel.getProprietarios()) {
            //                iptu.setProprietario(proprietario);
            //            }
            if (imovel.getProprietarios() == null || imovel.getProprietarios().isEmpty()) {
                iptu.setProprietario(null);
            } else {
                iptu.setProprietario(imovel.getProprietarios().get(0));
            }
            int qtd = iptuServico.qtdParcelas(iptu.getValorBaseCorrigido(), config);
            //            int qtd = 3;

            iptu.setParcelas(iptuServico.gerarParcelas(imovel, valorIptu, qtd, iptu.getDataIptu()));
            iptu.setBaixaManual(false);

            if (possuiIPTU) {
                iptuServico.update(iptu);
            } else {
                iptuServico.save(iptu);
            }

        }
//        dadosIptuService.save(dadosIptu);
        Msg.messagemInfo("Iptu gerado");

    }

    public void geraBoleto() throws IOException, Exception {
        iptuServico.gerarGuia(null);
//        iptuService.gerarGuiaStella(null); 
    }

    public List<DadosIptu> all() {
        return dadosIptuService.findAll();
    }
}
